package br.unirio.octopus.util;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 	Classe  utilitaria que implementa o padrao Singleton e
 *  fornece servicos de criptografia utilizando o algoritmo SHA-256  
 * 
 * @author Victor
 *
 */
public class ManipuladorDeHash {

	private static ManipuladorDeHash instanciaDeManipulador;
	
	private static String ALGORITMO_UTILIZADO = "SHA-256";
	
	/**
	 * 	Metodo que retorna a instancia do ManipuladorDeHash.
	 * 	
	 * @return
	 */
	public static ManipuladorDeHash getManipuladorDeHash()
	{
		if(instanciaDeManipulador==null)
		{
			instanciaDeManipulador = new ManipuladorDeHash();
		}
		return instanciaDeManipulador;
	}
		

	 
	 /**
	 * 	Metodo que verifica se um texto nao criptografado equivale a outro criptografado.
	 * 
	 * 	Obs.: O texto codificado deve ter sido criptografado utilizando SHA-256.
	 * @param textoNaoCodificado 
	 * @param textoCodificado
	 * @return true caso sejam iguais ou false caso sejam diferentes.
	 */
	public  boolean verificarIgualdade(String textoNaoCodificado, String textoCodificado)
	 {
		 String hashGerado = obterHash(textoNaoCodificado);
		 if(hashGerado.equals(textoCodificado))
		 {
			 return true;
		 }
		 return false;
		 
	 }
	 
	 /**
	  * 	Metodo que criptografa e retorna o texto passado por parametro.
	 * @param texto
	 * @return
	 */
	public String obterHash(String texto)
	 {
		 try {
			 
	         MessageDigest md = MessageDigest.getInstance(ALGORITMO_UTILIZADO);
	         md.update(texto.getBytes("UTF-8")); 
	         byte[] digest = md.digest();
	         BigInteger bigInt = new BigInteger(1, digest);
	         String hash = bigInt.toString(16);

	         return hash;

	     } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {	         
	    	 return null;
	     }
		 
	 }
	
}
